﻿// Lavet af Andreas Horst, 3. semester
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Collections;
using ControllerLag;
using Model;
using System.ServiceModel.Activation;

namespace Service
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class VareService : IVareService
    {
        Controller controller;
        //VareCollection vareColl;
        Vare nuværendeVare;
        //Distributør distributør;

        public VareService()
        {
            controller = new Controller();
        }

        public VareDTO OpskrivVarensPris(int varenr, double pris)
        {
            nuværendeVare = controller.FindVare(varenr);
            if (nuværendeVare != null)
            {
                VareDTO vareDTO = new VareDTO(nuværendeVare.VareNr, nuværendeVare.Navn, nuværendeVare.Pris,
                                                                 nuværendeVare.Beskrivelse, nuværendeVare.Aktiv);

                if (varenr == nuværendeVare.VareNr)
                {
                    vareDTO.Pris = pris;
                    return vareDTO;
                }
            }

            return null;
        }

        public VareDTO NedskrivVarensPris(int varenr, double pris)
        {
            nuværendeVare = controller.FindVare(varenr);
            if (nuværendeVare != null)
            {
                VareDTO vareDTO = new VareDTO(nuværendeVare.VareNr, nuværendeVare.Navn, nuværendeVare.Pris,
                                                                 nuværendeVare.Beskrivelse, nuværendeVare.Aktiv);

                if (varenr == nuværendeVare.VareNr)
                {
                    vareDTO.Pris = pris;
                    return vareDTO;
                }
            }

            return null;
        }

        public Ordre[] HentOrdreListe()
        {
            // Henter ordrelisten ved hjælp af enumerator, for at kunne iterere igennem den...
            IEnumerator enumerator = controller.HentOrdreListe();
            List<Ordre> ordreListe = new List<Ordre>(); // Liste af ordre.
            enumerator.Reset(); // Nulstiller enumerator (sætter start før første element i listen).

            // Ordren og dens delordre bliver ført med over i en liste af ordre, som bliver lavet om til et array
            // af ordre...
            while (enumerator.MoveNext()) // Mens enumerator kan finde næste element i listen.
            {
                // Istedetfor at instantiere et objekt af klassen som global variabel.
                // Henter det nuværende element i listen og lægges over i et order-objekt.
                Model.Ordre ordre = (Model.Ordre)enumerator.Current;

                // Laver et nyt ordre-objekt, så delordrelisten kan tilgåes (er ikke tilknyttet noget homeparty).
                Ordre nyOrdre = new Ordre(ordre.Ordrenr, ordre.Dato, null);

                // For hver delordre i delordrelisten på ordre-klassen.
                foreach (Delordre delordre in ordre.Delordreliste)
                {
                    // Tilføj på nyOrdre-objektet (skabt fra OrdreDTO) på delordrelisten en ny delordre (uden kunde).
                    nyOrdre.Delordreliste.Add(new DelordreDTO(null, delordre.Delordrenr, delordre.Betalt, delordre.Betalingsmetode));
                }
            }

            // Laver listen om til et array af ordre
            return ordreListe.ToArray();
        }

        // Henter varene fra varelisten fra modellaget af.
        public List<VareDTO> HentVarer()
        {
            // Formodet "bosat", altså listen er fyldt op!
            var origList = controller.HentVareliste();
            var targetList = new List<VareDTO>(); // Liste af vareDTO-objekter.
            
            // Lambda-Funktion (uden linq).
            targetList = origList.Select(x => new VareDTO(x.VareNr, x.Navn, x.Pris, 
                                   x.Beskrivelse, x.Aktiv)).ToList();
            return targetList;
        }

        public Vare HentVareAntal(int varenr, int antal)
        {
            controller.OpskrivVaresAntal(varenr, antal);
            return nuværendeVare;
        }

        public List<ForsendelseDTO> HentForsendelser()
        {
            var origList = controller.HentForsendelser();
            var targetList = new List<ForsendelseDTO>();

            //int distributørNr, string navn, string adresse, int postNr, long tlfNr, int region
            // Nyt distributørDTO-objekt instantieres inde i lambda-funktionen.
            targetList = origList.Select(x => new ForsendelseDTO(new DistributørDTO(x.Distributør.DistributørNr, 
                x.Distributør.Navn, x.Distributør.Adresse, x.Distributør.PostNr, x.Distributør.TlfNr, 
                x.Distributør.Region), x.ForsendelsesDato)).ToList();

            return targetList;
        }

    }
}
